1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<div class="panels">
<div class="panel panel1">
<p>Hey</p>
<p>Let's</p>
<p>Dance</p>
</div>
<div class="panel panel2">
<p>Give</p>
<p>Take</p>
<p>Receive</p>
</div>
<div class="panel panel3">
<p>Experience</p>
<p>It</p>
<p>Today</p>
</div>
<div class="panel panel4">
<p>Give</p>
<p>All</p>
<p>You can</p>
</div>
<div class="panel panel5">
<p>Life</p>
<p>In</p>
<p>Motion</p>
</div>
</div>

flex: flex-grow속성과 flex-shrink속성 그리고 flex-basis속성을 일괄적으로 지정할 수 있는 대표 속성입니다.

flex-grow: flex로 정의된 부모요소가 자식 요소보다 크거나 작을 경우, 자식 요소의 크기를 조정하는 방법으로 자식 요소에 확대 비율을 지정하여 부모요소의 크기에 맞게 자동으로 크기를 조정합니다.(기본값:0)

flex-shrink: flex로 정의된 부모요소가 자식 요소보다 크거나 작을 경우, 자식 요소의 크기를 조정하는 방법으로 자식 요소에 축소 비율을 지정하여 부모요소의 크기에 맞게 자동으로 크기를 조정합니다.(기본값:1)

1
2
3
4
5
6
7
8
9
10
11
.panel > * {
margin: 0;
width: 100%;
transition: transform 0.5s;

border: 1px solid red;
flex: 1 0 auto;
display: flex;
justify-content: center;
align-items: center;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
html {
box-sizing: border-box;
background: #ffc600;
font-family: "helvetica neue";
font-size: 20px;
font-weight: 200;
}

body {
margin: 0;
}

*,
*:before,
*:after {
box-sizing: inherit;
}

.panels {
min-height: 100vh;
overflow: hidden;

display: flex;
}

.panel {
background: #6b0f9c;
box-shadow: inset 0 0 0 5px rgba(255, 255, 255, 0.1);
color: white;
text-align: center;
align-items: center;
/* Safari transitionend event.propertyName === flex */
/* Chrome + FF transitionend event.propertyName === flex-grow */
transition: font-size 0.7s cubic-bezier(0.61, -0.19, 0.7, -0.11), flex 0.7s
cubic-bezier(0.61, -0.19, 0.7, -0.11), background 0.2s;
font-size: 20px;
background-size: cover;
background-position: center;

flex: 1;
justify-content: center;
align-items: center;
display: flex;
flex-direction: column;
}

.panel1 {
background-image: url(https://source.unsplash.com/gYl-UtwNg_I/1500x1500);
}

.panel2 {
background-image: url(https://source.unsplash.com/rFKUFzjPYiQ/1500x1500);
}

.panel3 {
background-image: url(https://images.unsplash.com/photo-1465188162913-8fb5709d6d57?ixlib=rb-0.3.5&q=80&fm=jpg&crop=faces&cs=tinysrgb&w=1500&h=1500&fit=crop&s=967e8a713a4e395260793fc8c802901d);
}

.panel4 {
background-image: url(https://source.unsplash.com/ITjiVXcwVng/1500x1500);
}

.panel5 {
background-image: url(https://source.unsplash.com/3MNzGlQM7qs/1500x1500);
}

/* Flex items */
.panel > * {
margin: 0;
width: 100%;
transition: transform 0.5s;

border: 1px solid red;
flex: 1 0 auto;
display: flex;
justify-content: center;
align-items: center;
}

.panel > *:first-child {
transform: translateY(-100%);
}

.panel.open-active > *:first-child {
transform: translateY(0);
}

.panel > *:last-child {
transform: translateY(100%);
}

.panel.open-active > *:last-child {
transform: translateY(0);
}

.panel p {
text-transform: uppercase;
font-family: "Amatic SC", cursive;
text-shadow: 0 0 4px rgba(0, 0, 0, 0.72), 0 0 14px rgba(0, 0, 0, 0.45);
font-size: 2em;
}

.panel p:nth-child(2) {
font-size: 4em;
}

.panel.open {
font-size: 40px;
flex: 5;
}

transitionend 이벤트: CSS를 전환이 완료되면 transitionend이벤트가 발생한다.

1
panels.forEach(panel => panel.addEventListener("transitionend", toggleActive));
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function toggleOpen() {
console.log("Hello");
this.classList.toggle("open");
}

function toggleActive(e) {
console.log(e);
console.log(e.propertyName);
if (e.propertyName.includes("flex")) {
this.classList.toggle("open-active");
}
}

const panels = document.querySelectorAll(".panel");
panels.forEach(panel => panel.addEventListener("click", toggleOpen));
panels.forEach(panel => panel.addEventListener("transitionend", toggleActive));